//
//  main.m
//  Day10homework
//
//  Created by dllo on 16/5/17.
//  Copyright © 2016年 lanou. All rights reserved.
//

#import <Foundation/Foundation.h>
void printHello();

void printHello() {
    printf("Hello");
}

typedef struct Studnet {
    int age;
    char name[20];
    int number;
}Student;

int main(int argc, const char * argv[]) {
#if 0
    // 第一题
    int *p = malloc(40);
    for (int i = 0; i < (40 /sizeof(int)); i++){
        *(p + i) = arc4random() % 78 + 98;
        printf("%d,", *(p + i));
    }
    
#endif
    
#if 0
    //第二题 动态申请80个字节,整形,随机赋值20 - 70,找到最大的数和最后一 位进行交换,找到最小和第一位进行交换,最后遍历输出
    int *p = malloc(80);
    int max = 0;
    int min = 70;
    int countMax = 0;
    int countMin = 5;
    for (int i = 0; i < (80 /sizeof(int)); i++) {
        *(p + i) = arc4random() % 51 + 20;
        printf("%d,",*(p + i));
        if(*(p + i) > max) {
            max = max > *(p + i) ? max : *(p + i);
            countMax = i;
        }
        if(*(p + i) < min) {
            min = min < *(p + i) ? min : *(p + i);
            countMin = i;
        }
    }
    //交换最大的数和最后一位
    int temp = *(p + countMax);
    *(p + countMax) = *(p + 80 /sizeof(int) - 1);
    *(p + 80 /sizeof(int) - 1) = temp;
    //交换最小值和第一位
    temp = *(p + countMin);
    *(p + countMin) = *(p);
    *p = temp;
    
    
    printf("\n");
    
    for (int i = 0; i < (80 /sizeof(int)); i++) {
        printf("%d,",*(p + i));
    }
#endif
    
    
#if 0
    //第三题 动态申请80个字节内容,然后随机赋值,范围是20-70,然后进行冒 泡排序
    int *p = malloc(80);
    for (int i = 0; i < (80/sizeof(int)); i++) {
        *(p + i) = arc4random() % 51 + 20;
    }
    
    for (int i = 0; i < (80/sizeof(int)) - 1; i++) {
        for (int j = 0; j < (80/sizeof(int) - 1 - i); j++) {
            if(*(p + j) > *(p + j + 1)){
                int temp = *(p + j);
                *(p + j) = *(p + j + 1);
                *(p + j + 1) = temp;
            }
        }
    }
    for (int i = 0; i < (80 /sizeof(int)); i++) {
        printf("%d,",*(p + i));
    }

#endif
    
#if 0
    // 第四题 动态申请80个字节,随机赋值20-70,然后把整个顺序头尾倒置,最 后输出全部内容
    int *p = malloc(80);
    for (int i = 0; i < (80/sizeof(int)); i++) {
        *(p + i) = arc4random() % 51 + 20;
    }
    for (int i = 0; i < (80 /sizeof(int)); i++) {
        printf("%d,",*(p + i));
    }
    int *pC = malloc(80);
    for (int i = 0; i < (80/sizeof(int)); i++) {
        *(pC + i) = *(p + i);
    }
    for (int i = 0; i < (80/sizeof(int)); i++) {
        *(p + i) = *(pC + 19 - i);
    }
    printf("\n");
    for (int i = 0; i < (80 /sizeof(int)); i++) {
        printf("%d,",*(p + i));
    }
    
    
#endif
    
#if 0
    // 第五题 找到100到999之间所有的水仙花数,并且把找到的数保存到堆空间
    int *p = malloc(256);
    int d = 0;
    int index = 0;
    
    for (int a = 1; a < 10; a++) {
        for (int b = 0; b < 10; b++) {
            for (int c = 0; c < 10; c++){
                d = a*a*a + b*b*b + c*c*c;
                if(a * 100 + b * 10 + c == d){
                    *(p + index) = a * 100 + b * 10 + c;
                    index++;
                }
            }
        }
    }
    for(int i = 0 ;i < 256 / 4; i++){
        printf("%d,", *(p + i));
    }
    
#endif
    
#if 1
    // 第六题 通过动态内存分配的方法,找到200到300之间,百位,十位,个位和为 12,乘积是42的数
    
    int *p = malloc(4);
    int index = 0;
    int hun = 0;
    int ten = 0;
    int num = 0;
    for (int i = 200; i < 301; i++) {
            hun = i / 100;
            ten = i % 100 / 10;
            num = i % 10;
        if(hun + ten + num == 12  && hun * ten * num == 42) {
            index++;
            p = realloc(p, index * sizeof(int));
            p [index - 1] = i;
//            printf("%d,", i);
        }
    }
    for(int i = 0 ;i < 2; i++){
        printf("%d,", i[p]);
    }

    
    
#endif
    
#if 0
    // 第七题 从键盘输入一个字符串,利用字符串的方法,动态申请内存,然后把 字符串放到堆空间保存
    char str[20];
    printf("请输入一个字符串\n");
    scanf("%s",str);
    char *p = malloc(sizeof(str)/sizeof(char));
    strcpy(p , str);
    printf("%s\n",p);
    
    
    
#endif
    
#if 0
    // 第八题 通过键盘输入一个字符串,有一已知字符串,其中包含 数字 字符, 提取其中的 数字字符 ,要求动态分配内存保存
    
    char str[20];
    printf("请输入一个字符串\n");
    scanf("%s",str);
    char *p = malloc(sizeof(str)/sizeof(char));
    strcpy(p , str);
    int index = 0;
    for (int i = 0;i < sizeof(str)/sizeof(char); i++) {
        if (*(p + i) >= '0' && *(p + i) <= '9'){
            *(p + index) = *(p + i);
            index++;
        }
    }
    *(p + index) = '\0';
    printf("%s", p);
    
    
#endif
    
#if 0
    // 第九题 保存一个学生类型的结构体变量到堆空间,并且能对成员变量进行 操作
    Student arthur = {20, "arthur", 6502};
    Student *p = malloc(sizeof(arthur));
    *p = arthur;
    printf("%d\n",p->number);
    
#endif
    
#if 0
    // 预习练习
    void (*p) () = NULL;
    p = printHello;
    
    p();
    
    
    
#endif
    
    return 0;
}
